/// 动态规划方法解决最小找零问题
/// 
/// # 参数
/// * `amount` - 需要找零的总金额
/// 
/// # 返回值
/// * 最少需要的纸币数量
pub fn dp_rec_mc(amount: u32) -> u32 {
    // 定义可用的币种
    let coins = [1, 2, 5, 10, 20, 30, 50, 100];

    // 创建一个向量来存储到达每个金额所需的最小纸币数量
    let mut dp = vec![u32::MAX; (amount + 1) as usize];
    
    // 金额为0时，所需纸币数量为0
    dp[0] = 0;

    // 动态规划计算
    for i in 1..=amount {
        for &coin in coins.iter() {
            if i >= coin {
                dp[i as usize] = dp[i as usize].min(dp[(i - coin) as usize] + 1);
            }
        }
    }

    // 如果最终的dp[amount]没有更新，说明没有组合可以组成该金额，返回0或错误处理
    if dp[amount as usize] == u32::MAX {
        return 0; // 或者可以选择返回一个错误码等
    }

    dp[amount as usize]
}